package bean;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

import org.hibernate.annotations.Cascade;

import bean.vo.ProductoVO;

@Entity 
@Table( name = "productos" )
public class Producto extends EntidadPersistente {
	@ManyToOne( cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH} )
	@Cascade( org.hibernate.annotations.CascadeType.SAVE_UPDATE)
	private Rodamiento rodamiento;
	@ManyToOne( cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH} )
	@Cascade( org.hibernate.annotations.CascadeType.SAVE_UPDATE)
	private Pais origen;
	@ManyToOne( cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH} )
	@Cascade( org.hibernate.annotations.CascadeType.SAVE_UPDATE)
	private Fabricante fabricante;
	private Integer stock;
	private Float precio;
	
	public Producto () {}
	
	public Producto (Rodamiento rodamiento, Pais origen, Fabricante fabricante){
		this.rodamiento = rodamiento;
		this.origen = origen;
		this.fabricante = fabricante;
	}
	
	public ProductoVO getVO() {
		ProductoVO vo = new ProductoVO();
		vo.setFabricante(fabricante != null ? fabricante.getVO() : null);
		vo.setOrigen(origen != null ? origen.getVO() : null);
		vo.setPrecio(precio);
		vo.setRodamiento(rodamiento != null ? rodamiento.getVO() : null);
		vo.setStock(stock);
		
		return vo;
	}
	
	public Rodamiento getRodamiento() {
		return rodamiento;
	}
	
	public void setRodamiento(Rodamiento rodamiento) {
		this.rodamiento = rodamiento;
	}
	
	public Pais getOrigen() {
		return origen;
	}
	
	public void setOrigen(Pais origen) {
		this.origen = origen;
	}
	
	public Fabricante getFabricante() {
		return fabricante;
	}
	
	public void setFabricante(Fabricante fabricante) {
		this.fabricante = fabricante;
	}
	
	public Integer getStock() {
		return stock;
	}
	
	public void setStock(Integer stock) {
		this.stock = stock;
	}
	
	public Float getPrecio() {
		return precio;
	}
	
	public void setPrecio(Float precio) {
		this.precio = precio;
	}
	
	@Override
	public int hashCode() {
		final int primo = 31;
		int result = 1;
		int hashRodamiento = (rodamiento != null ? rodamiento.hashCode() : 0);
		int hashOrigen = (origen != null ? origen.hashCode() : 0);
		int hashFabricante = (fabricante != null ? fabricante.hashCode() : 0);
		result = primo * (result + hashRodamiento + hashOrigen + hashFabricante);
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj) return true;	
		if ((obj == null) || (!(obj instanceof Producto))) {
			return false;
		}
		Producto otro = (Producto) obj;
		
		return rodamiento != null && rodamiento.equals(otro.getRodamiento()) && 
				origen != null && origen.equals(otro.getOrigen()) &&
				fabricante != null && fabricante.equals(otro.getFabricante());
	}
}
